package com.example.demo.nio;

import java.nio.ByteBuffer;

public class Buffer {
    public static void main(String[] args) {

        // 常用的创建缓冲区的方式
        /*
         * 在这里创建时传入的数字就是capacity，同时它会在内部被赋值给limit。
         * 此时操作buffer的话它的操作范围就会是整个1024的大小。
         */
        ByteBuffer buffer=ByteBuffer.allocate(1024);


        // 写入操作
        // 直接给数据,用的不多，一般都是用wrap或者直接通过写入操作给数据
        buffer.put((byte) 5);
        buffer.put("qwe".getBytes());

        // 比较常用,根据传入的byte数组直接返回一个填充好的ByteBuffer
        // 可以不传后面的参数只传数组,会填充全部数据。也可以传入范围只取数组的一部分。
        ByteBuffer byteBuffer = ByteBuffer.wrap("qwe".getBytes(), 0, 2);



        // 读取操作
        // 把整个缓存区先拿出来，然后通过范围去把对应字节转为字符串
        // 这里是从0开始到limit前一位结束（一般而言limit会指向最后一个可操作元素的后一位）
        new String(buffer.array(),0,buffer.limit());

        // 获得当前position位置的字节
        // 也可以传入下标得到对应下标位置的字节
        buffer.get();
        buffer.get(3);

        // 反转缓冲区，说白了就是把position的数值赋值给limit
        // 然后把position设置为0。这样的话操作范围就会变成0-当前最后一个有意义字节的位置了
        buffer.flip();

        // buffer.limit()会返回limit，同理buffer.position()会返回position位置。
        // 也可以通过这个方法直接改变他们在数组中的位置
        buffer.limit();
        buffer.limit(5);
        buffer.position();
        buffer.position(0);

        // 返回布尔值，表示当前操作范围内是否还有可用元素(就是position是否小于limit)
        buffer.hasRemaining();

        // 清空缓存区内容
        buffer.clear();



    }
}
